package com.java.model.singleton;

import net.bytebuddy.asm.Advice;

/**
 * 懒汉模式
 * @author wangning
 * @create 2021-04-20 14:38
 */
public class LazySingleton {
	//懒汉模式
	//缺点：每次获取单例对象，都需要synchronized加锁调用，性能会下降
	private static volatile LazySingleton instance;
	//volatile可以保证可见性，有序性，这里主要是为了有序性问题
	//可以使用 javap -c -v -p LazySingleton.class 把class文件反编译一下
	private LazySingleton() {
		System.out.println("private LazySingleton");
	}

	//解决多线程下，除了以下在方法上加锁，还可以双if加锁叫做双检锁
	/*public static synchronized LazySingleton getInstance() {
		if(instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}*/

	//双检锁必须给加上volatile
	public static LazySingleton getInstance() {
		if(instance == null) {
			synchronized (LazySingleton.class) {
				if(instance == null) {
					instance = new LazySingleton();
				}
			}
		}
		return instance;
	}

	public static void otherMethod() {
		System.out.println("otherMethod");
	}
}
